home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Programmer Disk
/
The Programmer Disk (Microforum).iso
/
xpro
/
c2
/
pro4
/
axis.c
< prev
next >
Wrap
Text File
|
1986-05-27
|
6KB
|
228 lines
/* «RM120»«PL99999»«TS4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76» «MDBO»from axis.hgh «MDNM»*/
#include <stdio.h>
#define EXTERN extern
#include <typedef.h>
extern double log10();
extern double pow();
extern double fabs();
double s, Fract;
static int GetExponent(X1)
double X1;
{
if (X1 == 0.)
return(0);
else if (fabs(X1) >= 1.)
return((int)(.01 + log10(fabs(X1))));
else
return(-(int)(.01 + log10(fabs(X1))));
}
static void DrawNum(x1, y1, MaxExponent, Number)
int x1, y1, MaxExponent;
double Number;
{
register int i;
WrkString StrNumber;
double t;
sprintf(StrNumber, "%5.2lf", Number * pow(10., -(double)MaxExponent));
y1 = y1 - 3;
for (i = 0; i < 5; i++)
DrawAscii(&x1, &y1, 1, StrNumber[i]);
}
static int Balance()
{
s = s + Fract;
if (s >= 0) {
s = s - 1.0;
return(1);
}
else
return(0);
}
static void DrawExponent(x1,y1,MaxExponent)
int x1, y1, MaxExponent;
{
int i;
WrkString StrNumber;
y1 = y1-3;
x1 = x1+1;
DrawAscii(&x1, &y1, 1, 49);
DrawAscii(&x1, &y1, 1, 48);
sprintf(StrNumber, "%3d", MaxExponent);
y1 = y1-3;
x1 = x1-7;
for (i = 0; i < 3; i++)
DrawAscii(&x1, &y1, 1, StrNumber[i]);
}
void DrawAxis(XDens,YDens,XLeft,YTop,XRight,YBottom,XAxis,YAxis,Arrows)
int XDens,YDens,XLeft,YTop,XRight,YBottom,XAxis,YAxis,Arrows;
{
register int i;
int LineStyleLoc,xk0,yk0,xk1,yk1,xk2,yk2;
int x2,y2,MaxExponentX,MaxExponentY,ys,xs,Delta,NPoints;
double Difference,Number,s,Fract;
int X1RefLoc,X2RefLoc,Y1RefLoc,Y2RefLoc;
int X1RefLoc2,X2RefLoc2,Y1RefLoc2,Y2RefLoc2;
int ClippingLoc,DirectModeLoc,HeaderLoc;
LineStyleLoc = LineStyleGlb;
SetLineStyle(0);
DirectModeLoc = DirectModeGlb;
DirectModeGlb = TRUE;
X1RefLoc = window[WindowNdxGlb].x1;
X2RefLoc = window[WindowNdxGlb].x2;
Y1RefLoc = window[WindowNdxGlb].y1;
Y2RefLoc = window[WindowNdxGlb].y2;
ReDefineWindow(WindowNdxGlb, window[WindowNdxGlb].x1+XLeft,
window[WindowNdxGlb].y1+YTop, window[WindowNdxGlb].x2-XRight,
window[WindowNdxGlb].y2-YBottom);
SelectWindow(WindowNdxGlb);
if ((XDens < 0) ^ (YDens < 0)) {
HeaderLoc = HeaderGlb;
HeaderGlb = FALSE;
DrawBorder();
HeaderGlb = HeaderLoc;
}
XDens = iabs(XDens);
YDens = iabs(YDens);
if (XDens > 9)
XDens = 0;
if (YDens > 9)
YDens = 0;
xk0 = (X1RefGlb+4) << 3;
yk0 = Y2RefGlb - 14;
yk1 = Y1RefGlb + 6;
xk1 = xk0;
yk2 = yk0;
xk2 = (X2RefGlb << 3) - 9;
if ((XAxis >= 0) || (YAxis >= 0)) {
ClippingLoc = ClippingGlb;
ClippingGlb = TRUE;
X1RefLoc2 = window[WindowNdxGlb].x1;
X2RefLoc2 = window[WindowNdxGlb].x2;
Y1RefLoc2 = window[WindowNdxGlb].y1;
Y2RefLoc2 = window[WindowNdxGlb].y2;
ReDefineWindow(WindowNdxGlb,X1RefLoc2+4,Y1RefLoc2+6,X2RefLoc2-2,
Y2RefLoc2-14);
SelectWindow(WindowNdxGlb);
DirectModeGlb = FALSE;
if (XAxis >= 0) {
SetLineStyle(XAxis);
DrawLine((double)X1WldGlb, (double)Y1WldGlb+Y2WldGlb,
(double)X2WldGlb, (double)Y1WldGlb+Y2WldGlb);
SetLineStyle(0);
}
if (YAxis >= 0) {
SetLineStyle(YAxis);
DrawLine(0., (double)Y1WldGlb, 0., (double)Y2WldGlb);
SetLineStyle(0);
}
ClippingGlb = ClippingLoc;
DirectModeGlb = TRUE;
ReDefineWindow(WindowNdxGlb,X1RefLoc2,Y1RefLoc2,X2RefLoc2,Y2RefLoc2);
SelectWindow(WindowNdxGlb);
}
if (YDens >= 2) {
DrawLineDirect(xk0, yk0, xk1, yk1);
if (Arrows) {
DrawLineDirect(xk0, yk1, xk0 - 4, yk1 + 4);
DrawLineDirect(xk0, yk1, xk0 + 4, yk1 + 4);
dp(xk0, yk1 - 1);
}
}
if (XDens >= 2) {
DrawLineDirect(xk0, yk0, xk2 + 1, yk2);
if (Arrows) {
DrawLineDirect(xk2, yk2, xk2 - 4, yk2 - 4);
DrawLineDirect(xk2, yk2, xk2 - 4, yk2 + 4);
}
}
if ((iabs(yk0-yk1) >= 35) && (iabs(xk2-xk1) >= 150)) {
DrawLineDirect(xk0, yk0, xk0 - 4, yk0);
DrawLineDirect(xk0, yk0, xk0, yk0 + 4);
Delta = Y2RefGlb-Y1RefGlb-20;
NPoints = (int)(Delta / 7.);
if (YDens >= 4) {
if (fabs(Y2WldGlb) > fabs(Y1WldGlb))
MaxExponentY = GetExponent(Y2WldGlb);
else
MaxExponentY = GetExponent(Y1WldGlb);
DrawNum(X1RefGlb << 3, yk0+1, MaxExponentY, Y1WldGlb);
if (MaxExponentY != 0)
DrawExponent((X1RefGlb << 3) + 1, yk1 + 2, MaxExponentY);
}
Fract = Delta / (double)NPoints - 7.;
s = -Fract;
ys = yk0;
Difference = (Y2WldGlb - Y1WldGlb) / NPoints;
for (i = 1; i <= NPoints; i++) {
ys = ys-7-Balance();
if ((YDens > 2) && (ys > Y1RefGlb+13)) {
Number = Y1WldGlb + i * Difference;
DrawLineDirect(xk0, ys, xk0 - 4, ys);
if ((YDens >= 4) && ((i % (10-YDens)) == 0))
DrawNum(X1RefGlb << 3, ys + 1, MaxExponentY, Number);
}
}
if (XDens >= 4) {
if (fabs(X2WldGlb) > fabs(X1WldGlb))
MaxExponentX = GetExponent(X2WldGlb);
else
MaxExponentX = GetExponent(X1WldGlb);
DrawNum(xk0 - 14, yk0 + 10, MaxExponentX, X1WldGlb);
if (MaxExponentX != 0)
DrawExponent(xk2 - 13, yk0 + 10, MaxExponentX);
}
Delta = iabs(X2RefGlb-X1RefGlb) * 8 - 41;
NPoints = (int)(Delta / 30.);
Fract = (Delta - NPoints * 31) / (double)NPoints;
s = -Fract;
xs = xk0 - 1;
Difference = (X2WldGlb-X1WldGlb) / NPoints;
for (i = 1; i <= NPoints; i++) {
xs = xs + 30 + Balance();
if ((XDens > 2) && (xs < (X2RefGlb << 3) - 17)) {
Number = X1WldGlb + i * Difference;
DrawLineDirect(xs, yk0, xs, yk0 + 4);
if ((XDens>=4) && ((i % (10-XDens)) == 0))
DrawNum(xs - 14, yk0 + 10, MaxExponentX, Number);
}
}
}
ReDefineWindow(WindowNdxGlb,X1RefLoc,Y1RefLoc,X2RefLoc,Y2RefLoc);
SelectWindow(WindowNdxGlb);
DirectModeGlb = DirectModeLoc;
SetLineStyle(LineStyleLoc);
AxisGlb = TRUE;
X1Glb = XLeft;
X2Glb = XRight;
Y1Glb = YTop;
Y2Glb = YBottom;
}
void ResetAxis()
{
AxisGlb = TRUE;
}